home *** CD-ROM | disk | FTP | other *** search
Wrap
#! /bin/sh # # Copyright (c) 1999, 2010 Tanuki Software, Ltd. # http://www.tanukisoftware.com # All rights reserved. # # This software is the proprietary information of Tanuki Software. # You shall use it only in accordance with the terms of the # license agreement you entered into with Tanuki Software. # http://wrapper.tanukisoftware.com/doc/english/licenseOverview.html # # Java Service Wrapper sh script. Suitable for starting and stopping # wrapped Java applications on UNIX platforms. # #----------------------------------------------------------------------------- if [ -z "$WRAPPER_CONF" ]; then echo >&2 "WRAPPER_CONF not set; abort" exit 1 fi #----------------------------------------------------------------------------- # Required for HP-UX Startup if [ `uname -s` = "HP-UX" -o `uname -s` = "HP-UX64" ] ; then PATH=$PATH:/usr/bin fi # Get the fully qualified path to the script case $0 in /*) SCRIPT="$0" ;; *) PWD=`pwd` SCRIPT="$PWD/$0" ;; esac # Resolve the true real path without any sym links. CHANGED=true while [ "X$CHANGED" != "X" ] do # Change spaces to ":" so the tokens can be parsed. SAFESCRIPT=`echo $SCRIPT | sed -e 's; ;:;g'` # Get the real path to this script, resolving any symbolic links TOKENS=`echo $SAFESCRIPT | sed -e 's;/; ;g'` REALPATH= for C in $TOKENS; do # Change any ":" in the token back to a space. C=`echo $C | sed -e 's;:; ;g'` REALPATH="$REALPATH/$C" # If REALPATH is a sym link, resolve it. Loop for nested links. while [ -h "$REALPATH" ] ; do LS="`ls -ld "$REALPATH"`" LINK="`expr "$LS" : '.*-> \(.*\)$'`" if expr "$LINK" : '/.*' > /dev/null; then # LINK is absolute. REALPATH="$LINK" else # LINK is relative. REALPATH="`dirname "$REALPATH"`""/$LINK" fi done done if [ "$REALPATH" = "$SCRIPT" ] then CHANGED="" else SCRIPT="$REALPATH" fi done # Change the current directory to the location of the script cd "`dirname "$REALPATH"`" REALDIR=`pwd` # If the PIDDIR is relative, set its value relative to the full REALPATH to avoid problems if # the working directory is later changed. FIRST_CHAR=`echo $PIDDIR | cut -c1,1` if [ "$FIRST_CHAR" != "/" ] then PIDDIR=$REALDIR/$PIDDIR fi # Same test for WRAPPER_CMD FIRST_CHAR=`echo $WRAPPER_CMD | cut -c1,1` if [ "$FIRST_CHAR" != "/" ] then WRAPPER_CMD=$REALDIR/$WRAPPER_CMD fi # Same test for WRAPPER_CONF FIRST_CHAR=`echo $WRAPPER_CONF | cut -c1,1` if [ "$FIRST_CHAR" != "/" ] then WRAPPER_CONF=$REALDIR/$WRAPPER_CONF fi # Process ID ANCHORFILE="$PIDDIR/$APP_NAME.anchor" STATUSFILE="$PIDDIR/$APP_NAME.status" JAVASTATUSFILE="$PIDDIR/$APP_NAME.java.status" PIDFILE="$PIDDIR/$APP_NAME.pid" LOCKDIR="/var/lock/subsys" LOCKFILE="$LOCKDIR/$APP_NAME" pid="" # Resolve the location of the 'ps' command PSEXE="/usr/ucb/ps" if [ ! -x "$PSEXE" ] then PSEXE="/usr/bin/ps" if [ ! -x "$PSEXE" ] then PSEXE="/bin/ps" if [ ! -x "$PSEXE" ] then eval echo 'Unable to locate "ps".' eval echo 'Please report this message along with the location of the command on your system.' exit 1 fi fi fi # Resolve the os DIST_OS=`uname -s | tr [A-Z] [a-z] | tr -d ' '` case "$DIST_OS" in 'sunos') DIST_OS="solaris" ;; 'hp-ux' | 'hp-ux64') # HP-UX needs the XPG4 version of ps (for -o args) DIST_OS="hpux" UNIX95="" export UNIX95 ;; 'darwin') DIST_OS="macosx" ;; 'unix_sv') DIST_OS="unixware" ;; 'os/390') DIST_OS="zos" ;; esac # Resolve the architecture if [ "$DIST_OS" = "macosx" ] then OS_VER=`sw_vers | grep 'ProductVersion:' | grep -o '[0-9]*\.[0-9]*\.[0-9]*'` DIST_ARCH="universal" if [[ "$OS_VER" < "10.5.0" ]] then DIST_BITS="32" else DIST_BITS="64" fi APP_PLIST_BASE=${PLIST_DOMAIN}.${APP_NAME} APP_PLIST=${APP_PLIST_BASE}.plist else DIST_ARCH= DIST_ARCH=`uname -p 2>/dev/null | tr [A-Z] [a-z] | tr -d ' '` if [ "X$DIST_ARCH" = "X" ] then DIST_ARCH="unknown" fi if [ "$DIST_ARCH" = "unknown" ] then DIST_ARCH=`uname -m 2>/dev/null | tr [A-Z] [a-z] | tr -d ' '` fi case "$DIST_ARCH" in 'athlon' | 'i386' | 'i486' | 'i586' | 'i686') DIST_ARCH="x86" if [ "${DIST_OS}" = "solaris" ] ; then DIST_BITS=`isainfo -b` else DIST_BITS="32" fi ;; 'amd64' | 'x86_64') DIST_ARCH="x86" DIST_BITS="64" ;; 'ia32') DIST_ARCH="ia" DIST_BITS="32" ;; 'ia64' | 'ia64n' | 'ia64w') DIST_ARCH="ia" DIST_BITS="64" ;; 'ip27') DIST_ARCH="mips" DIST_BITS="32" ;; 'power' | 'powerpc' | 'power_pc' | 'ppc64') if [ "${DIST_ARCH}" = "ppc64" ] ; then DIST_BITS="64" else DIST_BITS="32" fi DIST_ARCH="ppc" if [ "${DIST_OS}" = "aix" ] ; then if [ `getconf KERNEL_BITMODE` -eq 64 ]; then DIST_BITS="64" else DIST_BITS="32" fi fi ;; 'pa_risc' | 'pa-risc') DIST_ARCH="parisc" if [ `getconf KERNEL_BITS` -eq 64 ]; then DIST_BITS="64" else DIST_BITS="32" fi ;; 'sun4u' | 'sparcv9' | 'sparc') DIST_ARCH="sparc" DIST_BITS=`isainfo -b` ;; '9000/800' | '9000/785') DIST_ARCH="parisc" if [ `getconf KERNEL_BITS` -eq 64 ]; then DIST_BITS="64" else DIST_BITS="32" fi ;; '2097') DIST_ARCH="390" DIST_BITS="32" ;; esac fi # OSX always places Java in the same location so we can reliably set JAVA_HOME if [ "$DIST_OS" = "macosx" ] then if [ -z "$JAVA_HOME" ]; then JAVA_HOME="/Library/Java/Home"; export JAVA_HOME fi fi # Test Echo ECHOTEST=`echo -n "x"` if [ "$ECHOTEST" = "x" ] then ECHOOPT="-n " else ECHOOPT="" fi gettext() { echo "$1" } outputFile() { if [ -f "$1" ] then eval echo ' $1 Found but not executable.'; else echo " $1" fi } # Decide on the wrapper binary to use. # If the bits of the OS could be detected, we will try to look for the # binary with the correct bits value. If it doesn't exist, fall back # and look for the 32-bit binary. If that doesn't exist either then # look for the default. WRAPPER_TEST_CMD="" if [ -f "$WRAPPER_CMD-$DIST_OS-$DIST_ARCH-$DIST_BITS" ] then WRAPPER_TEST_CMD="$WRAPPER_CMD-$DIST_OS-$DIST_ARCH-$DIST_BITS" if [ ! -x "$WRAPPER_TEST_CMD" ] then chmod +x "$WRAPPER_TEST_CMD" 2>/dev/null fi if [ -x "$WRAPPER_TEST_CMD" ] then WRAPPER_CMD="$WRAPPER_TEST_CMD" else outputFile "$WRAPPER_TEST_CMD" WRAPPER_TEST_CMD="" fi fi if [ -f "$WRAPPER_CMD-$DIST_OS-$DIST_ARCH-32" -a -z "$WRAPPER_TEST_CMD" ] then WRAPPER_TEST_CMD="$WRAPPER_CMD-$DIST_OS-$DIST_ARCH-32" if [ ! -x "$WRAPPER_TEST_CMD" ] then chmod +x "$WRAPPER_TEST_CMD" 2>/dev/null fi if [ -x "$WRAPPER_TEST_CMD" ] then WRAPPER_CMD="$WRAPPER_TEST_CMD" else outputFile "$WRAPPER_TEST_CMD" WRAPPER_TEST_CMD="" fi fi if [ -f "$WRAPPER_CMD" -a -z "$WRAPPER_TEST_CMD" ] then WRAPPER_TEST_CMD="$WRAPPER_CMD" if [ ! -x "$WRAPPER_TEST_CMD" ] then chmod +x "$WRAPPER_TEST_CMD" 2>/dev/null fi if [ -x "$WRAPPER_TEST_CMD" ] then WRAPPER_CMD="$WRAPPER_TEST_CMD" else outputFile "$WRAPPER_TEST_CMD" WRAPPER_TEST_CMD="" fi fi if [ -z "$WRAPPER_TEST_CMD" ] then eval echo 'Unable to locate any of the following binaries:' outputFile "$WRAPPER_CMD-$DIST_OS-$DIST_ARCH-$DIST_BITS" if [ ! "$DIST_BITS" = "32" ] then outputFile "$WRAPPER_CMD-$DIST_OS-$DIST_ARCH-32" fi outputFile "$WRAPPER_CMD" exit 1 fi # Build the nice clause if [ "X$PRIORITY" = "X" ] then CMDNICE="" else CMDNICE="nice -$PRIORITY" fi # Build the anchor file clause. if [ "X$IGNORE_SIGNALS" = "X" ] then ANCHORPROP= IGNOREPROP= else ANCHORPROP=wrapper.anchorfile=\"$ANCHORFILE\" IGNOREPROP=wrapper.ignore_signals=TRUE fi # Build the status file clause. if [ "X$DETAIL_STATUS$WAIT_FOR_STARTED_STATUS" = "X" ] then STATUSPROP= else STATUSPROP="wrapper.statusfile=\"$STATUSFILE\" wrapper.java.statusfile=\"$JAVASTATUSFILE\"" fi if [ ! -n "$WAIT_FOR_STARTED_STATUS" ] then WAIT_FOR_STARTED_STATUS=true fi if [ $WAIT_FOR_STARTED_STATUS = true ] ; then DETAIL_STATUS=true fi # Build the lock file clause. Only create a lock file if the lock directory exists on this platform. LOCKPROP= if [ -d $LOCKDIR ] then if [ -w $LOCKDIR ] then LOCKPROP=wrapper.lockfile=\"$LOCKFILE\" fi fi checkUser() { # $1 touchLock flag # $2 command # Check the configured user. If necessary rerun this script as the desired user. if [ "X$RUN_AS_USER" != "X" ] then # Resolve the location of the 'id' command IDEXE="/usr/xpg4/bin/id" if [ ! -x "$IDEXE" ] then IDEXE="/usr/bin/id" if [ ! -x "$IDEXE" ] then eval echo 'Unable to locate "id".' eval echo 'Please report this message along with the location of the command on your system.' exit 1 fi fi if [ "`$IDEXE -u -n`" = "$RUN_AS_USER" ] then # Already running as the configured user. Avoid password prompts by not calling su. RUN_AS_USER="" fi fi if [ "X$RUN_AS_USER" != "X" ] then # If LOCKPROP and $RUN_AS_USER are defined then the new user will most likely not be # able to create the lock file. The Wrapper will be able to update this file once it # is created but will not be able to delete it on shutdown. If $2 is defined then # the lock file should be created for the current command if [ "X$LOCKPROP" != "X" ] then if [ "X$1" != "X" ] then # Resolve the primary group RUN_AS_GROUP=`groups $RUN_AS_USER | awk '{print $3}' | tail -1` if [ "X$RUN_AS_GROUP" = "X" ] then RUN_AS_GROUP=$RUN_AS_USER fi touch $LOCKFILE chown $RUN_AS_USER:$RUN_AS_GROUP $LOCKFILE fi fi # Still want to change users, recurse. This means that the user will only be # prompted for a password once. Variables shifted by 1 # # Use "runuser" if this exists. runuser should be used on RedHat in preference to su. # if test -f "/sbin/runuser" then /sbin/runuser - $RUN_AS_USER -c "\"$REALPATH\" $2" else su - $RUN_AS_USER -c "\"$REALPATH\" $2" fi # Now that we are the original user again, we may need to clean up the lock file. if [ "X$LOCKPROP" != "X" ] then getpid if [ "X$pid" = "X" ] then # Wrapper is not running so make sure the lock file is deleted. if [ -f "$LOCKFILE" ] then rm "$LOCKFILE" fi fi fi exit 0 fi } getpid() { pid="" if [ -f "$PIDFILE" ] then if [ -r "$PIDFILE" ] then pid=`cat "$PIDFILE"` if [ "X$pid" != "X" ] then # It is possible that 'a' process with the pid exists but that it is not the # correct process. This can happen in a number of cases, but the most # common is during system startup after an unclean shutdown. # The ps statement below looks for the specific wrapper command running as # the pid. If it is not found then the pid file is considered to be stale. case "$DIST_OS" in 'freebsd') pidtest=`$PSEXE -p $pid -o args | tail -1` if [ "X$pidtest" = "XCOMMAND" ] then pidtest="" fi ;; 'macosx') pidtest=`$PSEXE -ww -p $pid -o command | grep "$WRAPPER_CMD" | tail -1` ;; 'solaris') if [ -f "/usr/bin/pargs" ] then pidtest=`pargs $pid | grep "$WRAPPER_CMD" | tail -1` else case "$PSEXE" in '/usr/ucb/ps') pidtest=`$PSEXE -auxww $pid | grep "$WRAPPER_CMD" | tail -1` ;; '/usr/bin/ps') TRUNCATED_CMD=`$PSEXE -o comm -p $pid | tail -1` COUNT=`echo $TRUNCATED_CMD | wc -m` COUNT=`echo ${COUNT}` COUNT=`expr $COUNT - 1` TRUNCATED_CMD=`echo $WRAPPER_CMD | cut -c1-$COUNT` pidtest=`$PSEXE -o comm -p $pid | grep "$TRUNCATED_CMD" | tail -1` ;; '/bin/ps') TRUNCATED_CMD=`$PSEXE -o comm -p $pid | tail -1` COUNT=`echo $TRUNCATED_CMD | wc -m` COUNT=`echo ${COUNT}` COUNT=`expr $COUNT - 1` TRUNCATED_CMD=`echo $WRAPPER_CMD | cut -c1-$COUNT` pidtest=`$PSEXE -o comm -p $pid | grep "$TRUNCATED_CMD" | tail -1` ;; *) echo "Unsupported ps command $PSEXE" exit 1 ;; esac fi ;; 'hpux') pidtest=`$PSEXE -p $pid -x -o args | grep "$WRAPPER_CMD" | tail -1` ;; *) pidtest=`$PSEXE -p $pid -o args | grep "$WRAPPER_CMD" | tail -1` ;; esac if [ "X$pidtest" = "X" ] then # This is a stale pid file. rm -f "$PIDFILE" eval echo 'Removed stale pid file: $PIDFILE' pid="" fi fi else eval echo 'Cannot read $PIDFILE.' exit 1 fi fi } getstatus() { STATUS= if [ -f "$STATUSFILE" ] then if [ -r "$STATUSFILE" ] then STATUS=`cat "$STATUSFILE"` fi fi if [ "X$STATUS" = "X" ] then STATUS="Unknown" fi JAVASTATUS= if [ -f "$JAVASTATUSFILE" ] then if [ -r "$JAVASTATUSFILE" ] then JAVASTATUS=`cat "$JAVASTATUSFILE"` fi fi if [ "X$JAVASTATUS" = "X" ] then JAVASTATUS="Unknown" fi } testpid() { case "$DIST_OS" in 'solaris') case "$PSEXE" in '/usr/ucb/ps') pid=`$PSEXE $pid | grep $pid | grep -v grep | awk '{print $1}' | tail -1` ;; '/usr/bin/ps') pid=`$PSEXE -p $pid | grep $pid | grep -v grep | awk '{print $1}' | tail -1` ;; '/bin/ps') pid=`$PSEXE -p $pid | grep $pid | grep -v grep | awk '{print $1}' | tail -1` ;; *) echo "Unsupported ps command $PSEXE" exit 1 ;; esac ;; *) pid=`$PSEXE -p $pid | grep $pid | grep -v grep | awk '{print $1}' | tail -1` 2>/dev/null ;; esac if [ "X$pid" = "X" ] then # Process is gone so remove the pid file. rm -f "$PIDFILE" pid="" fi } launchdtrap() { stopit exit } waitforwrapperstop() { getpid while [ "X$pid" != "X" ] ; do sleep 1 getpid done } launchdinternal() { getpid trap launchdtrap TERM if [ "X$pid" = "X" ] then # The string passed to eval must handles spaces in paths correctly. COMMAND_LINE="$CMDNICE \"$WRAPPER_CMD\" \"$WRAPPER_CONF\" wrapper.syslog.ident=\"$APP_NAME\" wrapper.pidfile=\"$PIDFILE\" wrapper.name=\"$APP_NAME\" wrapper.displayname=\"$APP_LONG_NAME\" wrapper.daemonize=TRUE $ANCHORPROP $IGNOREPROP $STATUSPROP $LOCKPROP" eval $COMMAND_LINE else eval echo '$APP_LONG_NAME is already running.' exit 1 fi # launchd expects that this script stay up and running so we need to do our own monitoring of the Wrapper process. if [ $WAIT_FOR_STARTED_STATUS = true ] then waitforwrapperstop fi } console() { eval echo 'Running $APP_LONG_NAME...' getpid if [ "X$pid" = "X" ] then trap '' 3 # The string passed to eval must handles spaces in paths correctly. COMMAND_LINE="$CMDNICE \"$WRAPPER_CMD\" \"$WRAPPER_CONF\" wrapper.syslog.ident=\"$APP_NAME\" wrapper.pidfile=\"$PIDFILE\" wrapper.name=\"$APP_NAME\" wrapper.displayname=\"$APP_LONG_NAME\" $ANCHORPROP $STATUSPROP $LOCKPROP" eval $COMMAND_LINE else eval echo '$APP_LONG_NAME is already running.' exit 1 fi } waitforjavastartup() { getstatus eval echo $ECHOOPT `gettext 'Waiting for $APP_LONG_NAME...'` # Wait until the timeout or we have something besides Unknown. counter=15 while [ "$JAVASTATUS" = "Unknown" -a $counter -gt 0 -a -n "$JAVASTATUS" ] ; do echo $ECHOOPT"." sleep 1 getstatus counter=`expr $counter - 1` done if [ -n "$WAIT_FOR_STARTED_TIMEOUT" ] ; then counter=$WAIT_FOR_STARTED_TIMEOUT else counter=120 fi while [ "$JAVASTATUS" != "STARTED" -a "$JAVASTATUS" != "Unknown" -a $counter -gt 0 -a -n "$JAVASTATUS" ] ; do echo $ECHOOPT"." sleep 1 getstatus counter=`expr $counter - 1` done if [ "X$ECHOOPT" != "X" ] ; then echo "" fi } startwait() { if [ $WAIT_FOR_STARTED_STATUS = true ] then waitforjavastartup fi # Sleep for a few seconds to allow for intialization if required # then test to make sure we're still running. # i=0 while [ $i -lt $WAIT_AFTER_STARTUP ] do sleep 1 echo $ECHOOPT"." i=`expr $i + 1` done if [ $WAIT_AFTER_STARTUP -gt 0 -o $WAIT_FOR_STARTED_STATUS = true ] then getpid if [ "X$pid" = "X" ] then eval echo ' WARNING: $APP_LONG_NAME may have failed to start.' exit 1 else eval echo ' running: PID:$pid' fi else echo "" fi } macosxstart() { # The daemon has been installed. eval echo 'Starting $APP_LONG_NAME. Detected Mac OSX and installed launchd daemon.' if [ `id | sed 's/^uid=//;s/(.*$//'` != "0" ] ; then eval echo 'Must be root to perform this action.' exit 1 fi getpid if [ "X$pid" != "X" ] ; then eval echo '$APP_LONG_NAME is already running.' exit 1 fi # If the daemon was just installed, it may not be loaded. LOADED_PLIST=`launchctl list | grep ${APP_PLIST_BASE}` if [ "X${LOADED_PLIST}" = "X" ] ; then launchctl load /Library/LaunchDaemons/${APP_PLIST} fi # If launchd is set to run the daemon already at Load, we don't need to call start getpid if [ "X$pid" == "X" ] ; then launchctl start ${APP_PLIST_BASE} fi startwait } start() { eval echo 'Starting $APP_LONG_NAME...' getpid if [ "X$pid" = "X" ] then # The string passed to eval must handles spaces in paths correctly. COMMAND_LINE="$CMDNICE \"$WRAPPER_CMD\" \"$WRAPPER_CONF\" wrapper.syslog.ident=\"$APP_NAME\" wrapper.pidfile=\"$PIDFILE\" wrapper.name=\"$APP_NAME\" wrapper.displayname=\"$APP_LONG_NAME\" wrapper.daemonize=TRUE $ANCHORPROP $IGNOREPROP $STATUSPROP $LOCKPROP" eval $COMMAND_LINE else eval echo '$APP_LONG_NAME is already running.' exit 1 fi startwait } stopit() { # $1 exit if down flag eval echo 'Stopping $APP_LONG_NAME...' getpid if [ "X$pid" = "X" ] then eval echo '$APP_LONG_NAME was not running.' if [ "X$1" = "X1" ] then exit 1 fi else if [ "X$IGNORE_SIGNALS" = "X" ] then # Running so try to stop it. kill $pid if [ $? -ne 0 ] then # An explanation for the failure should have been given eval echo 'Unable to stop $APP_LONG_NAME.' exit 1 fi else rm -f "$ANCHORFILE" if [ -f "$ANCHORFILE" ] then # An explanation for the failure should have been given eval echo 'Unable to stop $APP_LONG_NAME.' exit 1 fi fi # We can not predict how long it will take for the wrapper to # actually stop as it depends on settings in wrapper.conf. # Loop until it does. savepid=$pid CNT=0 TOTCNT=0 while [ "X$pid" != "X" ] do # Show a waiting message every 5 seconds. if [ "$CNT" -lt "5" ] then CNT=`expr $CNT + 1` else eval echo 'Waiting for $APP_LONG_NAME to exit...' CNT=0 fi TOTCNT=`expr $TOTCNT + 1` sleep 1 testpid done pid=$savepid testpid if [ "X$pid" != "X" ] then eval echo 'Failed to stop $APP_LONG_NAME.' exit 1 else eval echo 'Stopped $APP_LONG_NAME.' fi fi } status() { getpid if [ "X$pid" = "X" ] then eval echo '$APP_LONG_NAME is not running.' exit 1 else if [ "X$DETAIL_STATUS" = "X" ] then eval echo '$APP_LONG_NAME is running: PID:$pid' else getstatus eval echo '$APP_LONG_NAME is running: PID:$pid, Wrapper:$STATUS, Java:$JAVASTATUS' fi exit 0 fi } installdaemon() { if [ `id | sed 's/^uid=//;s/(.*$//'` != "0" ] ; then eval echo 'Must be root to perform this action.' exit 1 else APP_NAME_LOWER=`echo "$APP_NAME" | tr [A-Z] [a-z]` if [ "$DIST_OS" = "solaris" ] ; then eval echo 'Detected Solaris:' if [ -f /etc/init.d/$APP_NAME ] ; then eval echo ' The $APP_LONG_NAME daemon is already installed.' exit 1 else eval echo ' Installing the $APP_LONG_NAME daemon..' ln -s "$REALPATH" "/etc/init.d/$APP_NAME" ln -s "/etc/init.d/$APP_NAME" "/etc/rc3.d/K20$APP_NAME_LOWER" ln -s "/etc/init.d/$APP_NAME" "/etc/rc3.d/S20$APP_NAME_LOWER" fi elif [ "$DIST_OS" = "linux" ] ; then if [ -f /etc/redhat-release -o -f /etc/redhat_version -o -f /etc/fedora-release ] ; then eval echo 'Detected RHEL or Fedora:' if [ -f "/etc/init.d/$APP_NAME" ] ; then eval echo ' The $APP_LONG_NAME daemon is already installed.' exit 1 else eval echo ' Installing the $APP_LONG_NAME daemon..' ln -s "$REALPATH" "/etc/init.d/$APP_NAME" /sbin/chkconfig --add "$APP_NAME" /sbin/chkconfig "$APP_NAME" on fi elif [ -f /etc/SuSE-release ] ; then eval echo 'Detected SuSE or SLES:' if [ -f "/etc/init.d/$APP_NAME" ] ; then eval echo ' The $APP_LONG_NAME daemon is already installed.' exit 1 else eval echo ' Installing the $APP_LONG_NAME daemon..' ln -s "$REALPATH" "/etc/init.d/$APP_NAME" insserv "/etc/init.d/$APP_NAME" fi elif [ -f /etc/lsb-release ] ; then eval echo 'Detected Ubuntu:' if [ -f "/etc/init.d/$APP_NAME" ] ; then eval echo ' The $APP_LONG_NAME daemon is already installed.' exit 1 else eval echo ' Installing the $APP_LONG_NAME daemon..' ln -s "$REALPATH" "/etc/init.d/$APP_NAME" update-rc.d "$APP_NAME" defaults fi else eval echo 'Detected Linux:' if [ -f "/etc/init.d/$APP_NAME" ] ; then eval echo ' The $APP_LONG_NAME daemon is already installed.' exit 1 else eval echo ' Installing the $APP_LONG_NAME daemon..' ln -s "$REALPATH" /etc/init.d/$APP_NAME ln -s "/etc/init.d/$APP_NAME" "/etc/rc3.d/K20$APP_NAME_LOWER" ln -s "/etc/init.d/$APP_NAME" "/etc/rc3.d/S20$APP_NAME_LOWER" ln -s "/etc/init.d/$APP_NAME" "/etc/rc5.d/S20$APP_NAME_LOWER" ln -s "/etc/init.d/$APP_NAME" "/etc/rc5.d/K20$APP_NAME_LOWER" fi fi elif [ "$DIST_OS" = "hpux" ] ; then eval echo 'Detected HP-UX:' if [ -f "/sbin/init.d/$APP_NAME" ] ; then eval echo ' The $APP_LONG_NAME daemon is already installed.' exit 1 else eval echo ' Installing the $APP_LONG_NAME daemon..' ln -s "$REALPATH" "/sbin/init.d/$APP_NAME" ln -s "/sbin/init.d/$APP_NAME" "/sbin/rc3.d/K20$APP_NAME_LOWER" ln -s "/sbin/init.d/$APP_NAME" "/sbin/rc3.d/S20$APP_NAME_LOWER" fi elif [ "$DIST_OS" = "aix" ] ; then eval echo 'Detected AIX:' if [ -f "/etc/rc.d/init.d/$APP_NAME" ] ; then eval echo ' The $APP_LONG_NAME daemon is already installed.' exit 1 else eval echo ' Installing the $APP_LONG_NAME daemon..' ln -s "$REALPATH" /etc/rc.d/init.d/$APP_NAME ln -s "/etc/rc.d/init.d/$APP_NAME" "/etc/rc.d/rc2.d/S20$APP_NAME_LOWER" ln -s "/etc/rc.d/init.d/$APP_NAME" "/etc/rc.d/rc2.d/K20$APP_NAME_LOWER" fi elif [ "$DIST_OS" = "freebsd" ] ; then eval echo 'Detected FreeBSD:' if [ -f "/etc/rc.d/$APP_NAME" ] ; then eval echo ' The $APP_LONG_NAME daemon is already installed.' exit 1 else eval echo ' Installing the $APP_LONG_NAME daemon..' sed -i .bak "/${APP_NAME}_enable=\"YES\"/d" /etc/rc.conf if [ -f "${REALDIR}/${APP_NAME}.install" ] ; then ln -s "${REALDIR}/${APP_NAME}.install" "/etc/rc.d/$APP_NAME" else echo '#!/bin/sh' > "/etc/rc.d/$APP_NAME" echo "#" >> "/etc/rc.d/$APP_NAME" echo "# PROVIDE: $APP_NAME" >> "/etc/rc.d/$APP_NAME" echo "# REQUIRE: NETWORKING" >> "/etc/rc.d/$APP_NAME" echo "# KEYWORD: shutdown" >> "/etc/rc.d/$APP_NAME" echo ". /etc/rc.subr" >> "/etc/rc.d/$APP_NAME" echo "name=\"$APP_NAME\"" >> "/etc/rc.d/$APP_NAME" echo "rcvar=\`set_rcvar\`" >> "/etc/rc.d/$APP_NAME" echo "command=\"${REALDIR}/${APP_NAME}\"" >> "/etc/rc.d/$APP_NAME" echo 'start_cmd="${name}_start"' >> "/etc/rc.d/$APP_NAME" echo 'load_rc_config $name' >> "/etc/rc.d/$APP_NAME" echo 'status_cmd="${name}_status"' >> "/etc/rc.d/$APP_NAME" echo 'stop_cmd="${name}_stop"' >> "/etc/rc.d/$APP_NAME" echo "${APP_NAME}_status() {" >> "/etc/rc.d/$APP_NAME" echo '${command} status' >> "/etc/rc.d/$APP_NAME" echo '}' >> "/etc/rc.d/$APP_NAME" echo "${APP_NAME}_stop() {" >> "/etc/rc.d/$APP_NAME" echo '${command} stop' >> "/etc/rc.d/$APP_NAME" echo '}' >> "/etc/rc.d/$APP_NAME" echo "${APP_NAME}_start() {" >> "/etc/rc.d/$APP_NAME" echo '${command} start' >> "/etc/rc.d/$APP_NAME" echo '}' >> "/etc/rc.d/$APP_NAME" echo 'run_rc_command "$1"' >> "/etc/rc.d/$APP_NAME" fi echo "${APP_NAME}_enable=\"YES\"" >> /etc/rc.conf chmod 555 "/etc/rc.d/$APP_NAME" fi elif [ "$DIST_OS" = "macosx" ] ; then eval echo 'Detected Mac OSX:' if [ -f "/Library/LaunchDaemons/${APP_PLIST}" ] ; then eval echo ' The $APP_LONG_NAME daemon is already installed.' exit 1 else eval echo ' Installing the $APP_LONG_NAME daemon..' if [ -f "${REALDIR}/${APP_PLIST}" ] ; then ln -s "${REALDIR}/${APP_PLIST}" "/Library/LaunchDaemons/${APP_PLIST}" else echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" > "/Library/LaunchDaemons/${APP_PLIST}" echo "<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\"" >> "/Library/LaunchDaemons/${APP_PLIST}" echo "\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">" >> "/Library/LaunchDaemons/${APP_PLIST}" echo "<plist version=\"1.0\">" >> "/Library/LaunchDaemons/${APP_PLIST}" echo " <dict>" >> "/Library/LaunchDaemons/${APP_PLIST}" echo " <key>Label</key>" >> "/Library/LaunchDaemons/${APP_PLIST}" echo " <string>${APP_PLIST_BASE}</string>" >> "/Library/LaunchDaemons/${APP_PLIST}" echo " <key>ProgramArguments</key>" >> "/Library/LaunchDaemons/${APP_PLIST}" echo " <array>" >> "/Library/LaunchDaemons/${APP_PLIST}" echo " <string>${REALDIR}/${APP_NAME}</string>" >> "/Library/LaunchDaemons/${APP_PLIST}" echo " <string>launchdinternal</string>" >> "/Library/LaunchDaemons/${APP_PLIST}" echo " </array>" >> "/Library/LaunchDaemons/${APP_PLIST}" echo " <key>OnDemand</key>" >> "/Library/LaunchDaemons/${APP_PLIST}" echo " <true/>" >> "/Library/LaunchDaemons/${APP_PLIST}" echo " <key>RunAtLoad</key>" >> "/Library/LaunchDaemons/${APP_PLIST}" echo " <true/>" >> "/Library/LaunchDaemons/${APP_PLIST}" if [ "X$RUN_AS_USER" != "X" ] ; then echo " <key>UserName</key>" >> "/Library/LaunchDaemons/${APP_PLIST}" echo " <string>${RUN_AS_USER}</string>" >> "/Library/LaunchDaemons/${APP_PLIST}" fi echo " </dict>" >> "/Library/LaunchDaemons/${APP_PLIST}" echo "</plist>" >> "/Library/LaunchDaemons/${APP_PLIST}" fi chmod 555 "/Library/LaunchDaemons/${APP_PLIST}" fi elif [ "$DIST_OS" = "zos" ] ; then eval echo 'Detected z/OS:' if [ -f /etc/rc.bak ] ; then eval echo ' The $APP_LONG_NAME daemon is already installed.' exit 1 else eval echo ' Installing the $APP_LONG_NAME daemon..' cp /etc/rc /etc/rc.bak sed "s:echo /etc/rc script executed, \`date\`::g" /etc/rc.bak > /etc/rc echo "_BPX_JOBNAME='${APP_NAME}' \"${REALDIR}/${APP_NAME}\" start" >>/etc/rc echo '/etc/rc script executed, `date`' >>/etc/rc fi else eval echo 'Install not currently supported for $DIST_OS' exit 1 fi fi } removedaemon() { if [ `id | sed 's/^uid=//;s/(.*$//'` != "0" ] ; then eval echo 'Must be root to perform this action.' exit 1 else stopit "0" APP_NAME_LOWER=`echo "$APP_NAME" | tr [A-Z] [a-z]` if [ "$DIST_OS" = "solaris" ] ; then eval echo 'Detected Solaris:' if [ -f "/etc/init.d/$APP_NAME" ] ; then eval echo ' Removing $APP_LONG_NAME daemon...' for i in "/etc/rc3.d/S20$APP_NAME_LOWER" "/etc/rc3.d/K20$APP_NAME_LOWER" "/etc/init.d/$APP_NAME" do rm -f $i done else eval echo ' The $APP_LONG_NAME daemon is not currently installed.' exit 1 fi elif [ "$DIST_OS" = "linux" ] ; then if [ -f /etc/redhat-release -o -f /etc/redhat_version -o -f /etc/fedora-release ] ; then eval echo 'Detected RHEL or Fedora:' if [ -f "/etc/init.d/$APP_NAME" ] ; then eval echo ' Removing $APP_LONG_NAME daemon...' /sbin/chkconfig "$APP_NAME" off /sbin/chkconfig --del "$APP_NAME" rm -f "/etc/init.d/$APP_NAME" else eval echo ' The $APP_LONG_NAME daemon is not currently installed.' exit 1 fi elif [ -f /etc/SuSE-release ] ; then eval echo 'Detected SuSE or SLES:' if [ -f "/etc/init.d/$APP_NAME" ] ; then eval echo ' Removing $APP_LONG_NAME daemon...' insserv -r "/etc/init.d/$APP_NAME" rm -f "/etc/init.d/$APP_NAME" else eval echo ' The $APP_LONG_NAME daemon is not currently installed.' exit 1 fi elif [ -f /etc/lsb-release ] ; then eval echo 'Detected Ubuntu:' if [ -f "/etc/init.d/$APP_NAME" ] ; then eval echo ' Removing $APP_LONG_NAME daemon...' update-rc.d -f "$APP_NAME" remove rm -f "/etc/init.d/$APP_NAME" else eval echo ' The $APP_LONG_NAME daemon is not currently installed.' exit 1 fi else eval echo 'Detected Linux:' if [ -f "/etc/init.d/$APP_NAME" ] ; then eval echo ' Removing $APP_LONG_NAME daemon...' for i in "/etc/rc3.d/K20$APP_NAME_LOWER" "/etc/rc5.d/K20$APP_NAME_LOWER" "/etc/rc3.d/S20$APP_NAME_LOWER" "/etc/init.d/$APP_NAME" "/etc/rc5.d/S20$APP_NAME_LOWER" do rm -f $i done else eval echo ' The $APP_LONG_NAME daemon is not currently installed.' exit 1 fi fi elif [ "$DIST_OS" = "hpux" ] ; then eval echo 'Detected HP-UX:' if [ -f "/sbin/init.d/$APP_NAME" ] ; then eval echo ' Removing $APP_LONG_NAME daemon...' for i in "/sbin/rc3.d/K20$APP_NAME_LOWER" "/sbin/rc3.d/S20$APP_NAME_LOWER" "/sbin/init.d/$APP_NAME" do rm -f $i done else eval echo ' The $APP_LONG_NAME daemon is not currently installed.' exit 1 fi elif [ "$DIST_OS" = "aix" ] ; then eval echo 'Detected AIX:' if [ -f "/etc/rc.d/init.d/$APP_NAME" ] ; then eval echo ' Removing $APP_LONG_NAME daemon...' for i in "/etc/rc.d/rc2.d/S20$APP_NAME_LOWER" "/etc/rc.d/rc2.d/K20$APP_NAME_LOWER" "/etc/rc.d/init.d/$APP_NAME" do rm -f $i done else eval echo ' The $APP_LONG_NAME daemon is not currently installed.' exit 1 fi elif [ "$DIST_OS" = "freebsd" ] ; then eval echo 'Detected FreeBSD:' if [ -f "/etc/rc.d/$APP_NAME" ] ; then eval echo ' Removing $APP_LONG_NAME daemon...' for i in "/etc/rc.d/$APP_NAME" do rm -f $i done sed -i .bak "/${APP_NAME}_enable=\"YES\"/d" /etc/rc.conf else eval echo ' The $APP_LONG_NAME daemon is not currently installed.' exit 1 fi elif [ "$DIST_OS" = "macosx" ] ; then eval echo 'Detected Mac OSX:' if [ -f "/Library/LaunchDaemons/${APP_PLIST}" ] ; then eval echo ' Removing $APP_LONG_NAME daemon...' # Make sure the plist is installed LOADED_PLIST=`launchctl list | grep ${APP_PLIST_BASE}` if [ "X${LOADED_PLIST}" != "X" ] ; then launchctl unload "/Library/LaunchDaemons/${APP_PLIST}" fi rm -f "/Library/LaunchDaemons/${APP_PLIST}" else eval echo ' The $APP_LONG_NAME daemon is not currently installed.' exit 1 fi elif [ "$DIST_OS" = "zos" ] ; then eval echo 'Detected z/OS:' if [ -f /etc/rc.bak ] ; then eval echo ' Removing $APP_LONG_NAME daemon...' cp /etc/rc /etc/rc.bak sed "s/_BPX_JOBNAME=\'APP_NAME\'.*//g" /etc/rc.bak > /etc/rc rm /etc/rc.bak else eval echo ' The $APP_LONG_NAME daemon is not currently installed.' exit 1 fi else eval echo 'Remove not currently supported for $DIST_OS' exit 1 fi fi } dump() { eval echo 'Dumping $APP_LONG_NAME...' getpid if [ "X$pid" = "X" ] then eval echo '$APP_LONG_NAME was not running.' else kill -3 $pid if [ $? -ne 0 ] then eval echo 'Failed to dump $APP_LONG_NAME.' exit 1 else eval echo 'Dumped $APP_LONG_NAME.' fi fi } # Used by HP-UX init scripts. startmsg() { getpid if [ "X$pid" = "X" ] then eval echo 'Starting $APP_LONG_NAME... Wrapper:Stopped' else if [ "X$DETAIL_STATUS" = "X" ] then eval echo 'Starting $APP_LONG_NAME... Wrapper:Running' else getstatus eval echo 'Starting $APP_LONG_NAME... Wrapper:$STATUS, Java:$JAVASTATUS' fi fi } # Used by HP-UX init scripts. stopmsg() { getpid if [ "X$pid" = "X" ] then eval echo 'Stopping $APP_LONG_NAME... Wrapper:Stopped' else if [ "X$DETAIL_STATUS" = "X" ] then eval echo 'Stopping $APP_LONG_NAME... Wrapper:Running' else getstatus eval echo 'Stopping $APP_LONG_NAME... Wrapper:$STATUS, Java:$JAVASTATUS' fi fi } case "$1" in 'console') checkUser touchlock $1 console ;; 'start') if [ "$DIST_OS" = "macosx" -a -f "/Library/LaunchDaemons/${APP_PLIST}" ] ; then macosxstart else checkUser touchlock $1 start fi ;; 'stop') checkUser "" $1 stopit "0" ;; 'restart') checkUser touchlock $1 stopit "0" start ;; 'condrestart') checkUser touchlock $1 stopit "1" start ;; 'status') checkUser "" $1 status ;; 'install') installdaemon ;; 'remove') removedaemon ;; 'dump') checkUser "" $1 dump ;; 'start_msg') # Internal command called by launchd on HP-UX. checkUser "" $1 startmsg ;; 'stop_msg') # Internal command called by launchd on HP-UX. checkUser "" $1 stopmsg ;; 'launchdinternal') # Internal command called by launchd on Max OSX. # We do not want to call checkUser here as it is handled in the launchd plist file. Doing it here would confuse launchd. launchdinternal ;; *) eval MSG=`gettext 'Usage: '` echo "${MSG} $0 { console | start | stop | restart | condrestart | status | install | remove | dump }" exit 1 ;; esac exit 0